import { decrypt, encrypt } from '../crypto';

function createSessionStorage<T extends StorageInterface.Session = StorageInterface.Session>() {
    function set<K extends keyof T>(key: K, value: T[K]) {
        const json = encrypt(value);
        sessionStorage.setItem(key as string, json);
    }
    function get<K extends keyof T>(key: K) {
        const json = sessionStorage.getItem(key as string);
        let data: T[K] | null = null;
        if (json) {
            try {
                data = decrypt(json);
            } catch {
                // 防止解析失败
            }
        }
        return data;
    }
    function remove(key: keyof T) {
        window.sessionStorage.removeItem(key as string);
    }
    function clear() {
        window.sessionStorage.clear();
    }

    return {
        set,
        get,
        remove,
        clear
    };
}

export const sessionStg = createSessionStorage();
